{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 当使用对位置不敏感(position-insensitive)的模型对文本数据建模的时候，才需要额外使用positional encoding。\n",
    "   - 如果模型的输出会随着输入文本数据顺序的变化而变化，那么这个模型就是关于位置敏感的，反之则是位置不敏感的。设模型为函数$y=f(x)$，其中输入为一个词序列$x=\\{x_1,x_2...x_n\\}$。将$x$任意重排序$\\hat{x}=\\text{shuffle}(x)$，都有$f(\\hat{x})=f(x)$，则模型是关于位置不敏感的。\n",
    "   \n",
    "   \n",
    "- RNN和textCNN都是关于位置敏感的，使用它们对文本数据建模时，模型结构天然考虑了文本中词与词之间的顺序关系。   \n",
    "- 以attention为核心的transformer则是位置不敏感的，使用这一类位置不敏感的模型的时候需要额外加入positional encoding引入文本中词与词的顺序关系。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Learned Positional Embedding编码绝对位置。直接对不同的位置随机初始化一个postion embedding，加到word embedding上输入模型，**作为参数**进行训练。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-04-08T08:51:03.923812Z",
     "start_time": "2020-04-08T08:51:03.915328Z"
    }
   },
   "source": [
    "- Sinusoidal Position Encoding\n",
    "使用正余弦函数表示绝对位置，通过两者乘积得到相对位置：\n",
    "    $PE(pos,2i)=sin(\\frac{pos}{10000^{\\frac{2i}{d_model}}})$ \n",
    "    \n",
    "    $PE(pos,2i+1)=cos(\\frac{pos}{10000^{\\frac{2i}{d_model}}})$\n",
    "这样设计的好处是位置pos+k的psotional encoding可以被位置pos线性表示，反应其相对位置关系。    \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- complex embedding   \n",
    "为了更好的让模型捕获更精确的相对位置关系，比如相邻，前序（precedence）等，ICLR 2020发表的文章《Encoding Word Oder In Complex Embeddings》使用了复数域的连续函数来编码词在不同位置的表示。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "某个词$w_j$在位置$pos$上的表示为其word embedding加上对应位置的embedding，都可以看作是从整数域$N$到实数域$R^D$的一个映射.对于word embedding来说，这样的设计是合理的。因为不同词的index是独立的，仅和我们具体使用的词典怎么排序有关系，某个词是否在另外一个词前面或者相邻没有任何的信息。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "位置的index并不是满足独立的假设，其顺序关系对文本的正确理解有非常重要的影响。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
